package cn.iocoder.yudao.module.eval.service.score;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.eval.controller.admin.score.vo.*;
import cn.iocoder.yudao.module.eval.dal.dataobject.score.EvalScoreRecordDO;
import cn.iocoder.yudao.module.eval.dal.dataobject.score.EvalScoreSummaryDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 评分与成绩 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalScoreService {

    /**
     * 提交评分记录
     *
     * @param saveReqVO 评分信息
     * @return 记录ID
     */
    Long submitScoreRecord(@Valid EvalScoreRecordSaveReqVO saveReqVO);

    /**
     * 更新评分记录
     *
     * @param updateReqVO 更新信息
     */
    void updateScoreRecord(@Valid EvalScoreRecordSaveReqVO updateReqVO);

    /**
     * 查询评分记录
     *
     * @param planId 计划ID
     * @param candidateId 参评人员ID
     * @param evaluatorId 考评员ID
     * @param subjectId 科目ID
     * @return 评分记录列表
     */
    List<EvalScoreRecordDO> getScoreRecords(Long planId, Long candidateId, Long evaluatorId, Long subjectId);

    /**
     * 获取评分记录详情
     *
     * @param recordId 记录ID
     * @return 评分记录
     */
    EvalScoreRecordDO getScoreRecord(Long recordId);

    /**
     * 提交评分
     *
     * @param recordId 记录ID
     */
    void submitScore(Long recordId);

    /**
     * 确认评分
     *
     * @param recordId 记录ID
     */
    void confirmScore(Long recordId);

    /**
     * 批量提交评分
     *
     * @param recordIds 记录ID列表
     */
    void batchSubmitScores(List<Long> recordIds);

    /**
     * 批量确认评分
     *
     * @param recordIds 记录ID列表
     */
    void batchConfirmScores(List<Long> recordIds);

    /**
     * 触发成绩计算
     *
     * @param planId 计划ID
     * @param calculationReqVO 计算规则
     */
    void calculateScores(Long planId, EvalScoreCalculationReqVO calculationReqVO);

    /**
     * 查询成绩汇总分页
     *
     * @param pageReqVO 分页查询
     * @return 成绩汇总分页
     */
    PageResult<EvalScoreSummaryDO> getScoreSummaryPage(EvalScoreSummaryPageReqVO pageReqVO);

    /**
     * 获取个人成绩详情
     *
     * @param candidateId 参评人员ID
     * @return 成绩汇总
     */
    EvalScoreSummaryDO getCandidateScoreSummary(Long candidateId);

    /**
     * 成绩复核
     *
     * @param summaryId 成绩汇总ID
     * @param reviewReqVO 复核信息
     */
    void reviewScore(Long summaryId, EvalScoreReviewReqVO reviewReqVO);

    /**
     * 获取计划的成绩汇总列表
     *
     * @param planId 计划ID
     * @return 成绩汇总列表
     */
    List<EvalScoreSummaryDO> getScoreSummariesByPlan(Long planId);

    /**
     * 成绩统计概览
     *
     * @param planId 计划ID
     * @return 统计信息
     */
    EvalScoreStatisticsRespVO getScoreStatistics(Long planId);

    /**
     * 成绩分布统计
     *
     * @param planId 计划ID
     * @return 分布统计
     */
    EvalScoreDistributionRespVO getScoreDistribution(Long planId);

    /**
     * 科目成绩统计
     *
     * @param planId 计划ID
     * @return 科目统计列表
     */
    List<EvalSubjectScoreStatisticsRespVO> getSubjectScoreStatistics(Long planId);

    /**
     * 考评员评分统计
     *
     * @param evaluatorId 考评员ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 评分统计
     */
    EvalEvaluatorScoreStatisticsRespVO getEvaluatorScoreStatistics(Long evaluatorId, String startDate, String endDate);

    /**
     * 参评人员成绩查询
     *
     * @param idNumber 身份证号
     * @param name 姓名
     * @param planId 计划ID
     * @return 成绩列表
     */
    List<EvalScoreSummaryDO> queryCandidateScores(String idNumber, String name, Long planId);

    /**
     * 验证成绩真伪
     *
     * @param summaryId 成绩汇总ID
     * @return 验证结果
     */
    EvalScoreVerificationRespVO verifyScore(Long summaryId);

    /**
     * 我的评分任务
     *
     * @param status 任务状态
     * @return 任务列表
     */
    List<EvalScoreTaskRespVO> getMyScoreTasks(Integer status);

    /**
     * 我在指定计划的评分任务
     *
     * @param planId 计划ID
     * @return 任务列表
     */
    List<EvalScoreTaskRespVO> getMyScoreTasksByPlan(Long planId);

    /**
     * 我的评分进度
     *
     * @return 进度信息
     */
    EvalMyScoreProgressRespVO getMyScoreProgress();

}
